這邊我們用的是接線生prometheus-operator的版本
namespace 我們這邊的慣例就是用 yc /或是不寫就是預設
監控單個MySql,用mysql-exporter實現對資料庫性能以及資源利用率的監控
方便閱讀 這邊叫要監控三個的資料庫
YCdata1:3306
YCdata2:3306
YCdata3:3306
請去你要監控的sql裡面 創建帳號密碼
config - 每組連線用的帳號密碼
Deployment - mysql-exporter
多個資料庫需要執行 --web.listen-address=XXXX
service - 開port號
Servicemonitor mysql-exporter-prometheus連線
請去你要監控的sql裡面 創建帳號密碼
然後賦予他process以及replication client權限
如下:
CREATE USER 'yc'@'%' IDENTIFIED BY 'yc';
grant process, replication client on *.* to 'yc'@'%';
寫一個連線用的config
大概如下
kind: ConfigMap
apiVersion: v1
metadata:
name: mysql-config
namespace: yc
data:
.56.cnf: |-
[client]
user=yc@yc-1
password=yc
port=3306
host=YCdata1
.57.cnf: |-
[client]
user=yc@yc-2
password=yc
port=3306
host=YCdata2
.80.cnf: |-
[client]
user=yc@yc-3
password=yc
port=3306
host=YCdata3
但是連線的東西如果沒有加密有點危險
寫config當然可以 但推薦測試完之後改用秘密(Secret)
寫法一樣
kind改成Secret 然後轉base 64即可
kind: Secret
apiVersion: v1
metadata:
name: mysql-config
namespace: yc
data:
.56.cnf: |-
XXXXXXXXXXXXXji3g4base64XXXXXXXXXX
.57.cnf: |-
XXXXXXXXXXXji3g4base64XXXXXXXXXXXXX
.80.cnf: |-
XXXXXXXXXXXXXji3g4base64XXXX
寫Deployment啦
這裡的labels是 app: mysql-exporter (等下要接service用)
kind: Deployment
apiVersion: apps/v1
metadata:
name: mysql-exporter
namespace: yc
spec:
replicas: 1
selector:
matchLabels:
app: mysql-exporter
template:
metadata:
creationTimestamp: null
labels:
app: mysql-exporter
spec:
volumes:
- name: config
secret:
secretName: mysql-config
defaultMode: 420
containers:
- name: mysql-exporter
image: 'prom/mysqld-exporter:latest'
ports:
- containerPort: 9104
protocol: TCP
env:
- name: DATA_SOURCE_NAME
value: >-
yc@yc-1:yc@(YCdata1:3306)/
- name: podIP
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.podIP
resources: {}
volumeMounts:
- name: config
mountPath: /etc/.56.cnf
subPath: .56.cnf
- name: config
mountPath: /etc/.57.cnf
subPath: .57.cnf
- name: config
mountPath: /etc/.80.cnf
subPath: .80.cnf
livenessProbe:
exec:
command:
- /bin/sh
- '-c'
- >-
nohup mysqld_exporter --web.listen-address=$podIP:9105
--config.my-cnf=/etc/.57.cnf & nohup mysqld_exporter
--web.listen-address=$podIP:9106 --config.my-cnf=/etc/.80.cnf
& exit
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
這邊的細節就是livenessProbe
如果沒有這段的話連不到另外兩個資料庫
你也可以試著先不要
然後手動key
kubectl exec -it mysql-exporter-xxxxx /bin/sh -n yc
進去之後打
mysqld_exporter就可以看到連線的內容
這時候就打
nohup mysqld_exporter --web.listen-address=$podIP:9105
--config.my-cnf=/etc/.57.cnf
就可以多連到一個資料庫了
這邊我們都弄完再回頭看
蓋service
這邊的labels是app: mysql-exporter 有這個等下接service monitor用的
這裡的selector是app: mysql-exporter 這樣才接的到pod 這好像是一句沒啥用的話
這邊可以開port號出來 提供大家使用 開了9104 9105 9106 三個 ,如果要增加/減少的話在這邊跟servicemonitor裡面更改
kind: Service
apiVersion: v1
metadata:
name: mysql-exporter
namespace: yc
labels:
app: mysql-exporter
spec:
ports:
- name: YCdata1
protocol: TCP
port: 9104
targetPort: 9104
- name: YCdata2
protocol: TCP
port: 9105
targetPort: 9105
- name: YCdata3
protocol: TCP
port: 9106
targetPort: 9106
selector:
app: mysql-exporter
type: ClusterIP
sessionAffinity: None
寫Servicemonitor啦
這個是拿來讓exporter <-> prometheus 互動的
Servicemonitor不能直接用新增yaml檔的方式
請vi Servicemonitor.yaml
kubectl apply -f Servicemonitor.yaml
relabelings把instance的名字改成自己喜歡的樣子 是很重要的 這樣在發警報通知的時候才會知道誰是誰
matchLabels寫app: mysql-exporter 如果你的prometheus是空的 表示你沒連到service 大概是這邊錯了
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: mysql-exporter
namespace: hktv-monitoring
spec:
endpoints:
- interval: 15s
port: YCdata1
relabelings:
- targetLabel: instance
replacement: YCdata1
- interval: 15s
port: YCdata2
relabelings:
- targetLabel: instance
replacement: YCdata2
- interval: 15s
port: YCdata3
relabelings:
- targetLabel: instance
replacement: YCdata3
namespaceSelector:
matchNames:
- hktv-monitoring
selector:
matchLabels:
app: mysql-exporter
完工。
至於要怎麼看有沒有連到 如果你是看我上一篇架prometheus的話 我們rule都寫好了 可以去看看。